
import Joi from 'joi';
import md5 from 'md5';
import jwt from 'jsonwebtoken';
import { getDB } from '@/server/utils/db';
import { responseJson } from '@/server/utils/helper';

/**
 * 1、获取客户端传来的手机号和密码
 * 2、数据校验
 * 3、查询数据库，如果不存在手机则返回手机号不存在或者密码错误
 * 4、如果已经注册，并且密码正确，就生成token，并返回给客户端，token根据jwt生成
 */

export default defineEventHandler(
  async (event) => {
    // 获取请求体
    const body = await readBody(event);
    
    // 校验数据joi
    const schema = Joi.object({
      phone: Joi.string().pattern(/1\d{10}/),
      password: Joi.string().required()
    });

    // 校验请求体
    try {
      // 校验请求体字段
      const value = await schema.validateAsync(body);
    }
    catch (error) {
      return responseJson(400, {
        success: false,
        msg: '请求参数错误',
        error: error
      });
    }

    // 密码加密MD5
    const salt = 'ueidfisgfilegfiff';
    const password = md5(md5(body.password) + salt);
    
    // 数据库交互
    const { find, close } = getDB();

    // 查询
    const con = find();

    try {
      // 查询数据库
      const [users] = await con.execute('SELECT * FROM `users` WHERE `phone`=? AND `password`=?', [body.phone, password]);

      // 判断是否已存在
      if (!users?.length) {
        return responseJson(200, {
          success: false,
          msg: '账号不存在或者密码错误',
          data: []
        });
      }

      // 密钥
      const secret = 'eifuisedfuvs';
      
      //生成token jsonwebtoken
      const token = jwt.sign(
        {
          exp: Math.floor(Date.now() / 1000) + (60 * 60),
          data: {
            data:{
              uid: users[0].id
            }
          }
        }, 
        secret
      );
      
      return responseJson(200, {
        success: true,
        msg: '登录成功',
        token: token,
        userInfo: {
          uid: users[0].id,
          phone: users[0].phone,
          nickname: users[0].nickname,
          avatar: users[0].avatar
        }
      });
    }
    catch (error) {

      return responseJson(500, {
        success: false,
        msg: '服务器错误',
        error: error
      });
    }
    finally {
      // 释放连接
      // close();
    }
  }
);